package Thread.Thread_Security.SingletonPattern;
//懒汉模式实现的单例模式
//同一个进程的线程之间共享同样的资源

class SingletonLazy {
    //此处先把这个实例设置为空，不着急创建实例
    //3.第三处优化 加volatile避免出现指令重排序问题
    private volatile static SingletonLazy instance=null;
    //把构造方法设置为private不让别人new，避免在一个线程中出现多个实例
    private SingletonLazy() {
    }
    private static Object locker=new Object();
    public static  SingletonLazy getInstance(){
        //通过加锁把if和new打包在一起执行，在同一把锁内，变成一个原子的操作
        //在最外层应该再加一层判定是否为第一次创建实例，只有第一次创建实例有线程安全问题
        //此处的两个if判断虽然写的一样但是作用完全不同
        if(instance==null){
            //1.加锁避免线程安全
            synchronized (locker){
                if(instance==null){
                    //先判定，再修改，会出现线程安全问题
                    //通过加锁来处理线程安全问题
                    instance=new SingletonLazy();
                }
            }
        }
        return instance;
    }
}
public class Demo31 {
    public static void main(String[] args) {
        SingletonLazy s1=SingletonLazy.getInstance();
        SingletonLazy s2=SingletonLazy.getInstance();
        System.out.println(s1==s2);
    }

}
